package com.interview.ujiuye7;
class DataNode{
    private int data;//数据
    private DataNode next;//下一个节点引用

    public DataNode(int data) {
        this.data = data;
    }

    public int getData() {
        return data;
    }

    public void setData(int data) {
        this.data = data;
    }

    public DataNode getNext() {
        return next;
    }

    public void setNext(DataNode next) {
        this.next = next;
    }
}
public class LinkedDemo {

    private DataNode head;//头结点
    //创建链表
    public LinkedDemo(int size){
        DataNode head = new DataNode(0);//头结点
        DataNode cur = head; // 0
        for (int i=1; i<size; i++){
            DataNode temp = new DataNode(i);//1
            cur.setNext(temp);//把新创建的节点连接到头结点  0-->1 , 1-->2,2--3
            cur = temp;
        }
        this.head = head;
    }
    //遍历链表
    public void printLinkedList(DataNode head){
        StringBuffer buffer = new StringBuffer();
        buffer.append(head.getData());//先把头结点数据放到缓冲区
        DataNode cur = head;//0->1->2->3
        while (cur.getNext() != null){
            buffer.append(" -> ");
            buffer.append(cur.getNext().getData());
            cur = cur.getNext();
        }
        System.out.println(buffer.toString());
    }

    public DataNode reverse(DataNode head) {
        //如果链表没有元素或者只有一个元素，不反转直接返回链表本身
        if (null == head || null == head.getNext())
            return head;
        //当链表超过两个及以上就需要反转
        DataNode pre = head;//用于保存当前节点的前一个节点
        DataNode cur = head.getNext();//cur保存当前节点
        while (null != cur.getNext()) {
            DataNode tmp = cur.getNext();//获取当前节点的下一个元素
            cur.setNext(pre);//把当前节点的next指向前一个元素
            pre = cur;//把当前节点改为前一个节点（其实就是前一个元素后移一位）。
            cur = tmp;//把当前节点的下一个节点改为当前节点（其实就是前一个元素后移一位）。
        }
        cur.setNext(pre);
        head.setNext(null);
        return cur;
    }
    public DataNode getHead() {
        return head;
    }

    public void setHead(DataNode head) {
        this.head = head;
    }

    public static void main(String[] args) {
        LinkedDemo demo = new LinkedDemo(10);
        demo.printLinkedList(demo.head);

        DataNode reverse = demo.reverse(demo.head);
        demo.printLinkedList(reverse);

    }
}
